From 9905ac2b90a3e7cecd9e7dfe21c252362e7080b2 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 9 Dec 2009 10:44:11 +0000 Subject: [PATCH] libxenlight: implement libxl_set_memory_target This patch adds a target_memkb parameter to libxl_domain_build_info to set the target memory for the VM at build time and a new function called libxl_set_memory_target to dynamically modify the memory target of a VM at run time. Finally a new command "mem-set" is added to xl that calls directly libxl_set_memory_target. Signed-off-by: Stefano Stabellini --- tools/libxl/libxl.c | 20 ++++++++++++++ tools/libxl/libxl.h | 3 ++ tools/libxl/libxl_dom.c | 8 ++++-- tools/libxl/libxl_internal.h | 1 + tools/libxl/xl.c | 53 +++++++++++++++++++++++++++++++++++- 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 29f9c7fbfa..043a827551 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -935,6 +935,7 @@ static int libxl_create_stubdom(struct libxl_ctx *ctx, memset(&b_info, 0x00, sizeof(libxl_domain_build_info)); b_info.max_vcpus = 1; b_info.max_memkb = 32 * 1024; + b_info.target_memkb = b_info.max_memkb; b_info.kernel = "/usr/lib/xen/boot/ioemu-stubdom.gz"; b_info.u.pv.cmdline = libxl_sprintf(ctx, " -d %d", info->domid); b_info.u.pv.ramdisk = ""; @@ -2264,6 +2265,7 @@ void init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_info * b_info->vpt_align = -1; b_info->max_vcpus = 1; b_info->max_memkb = 32 * 1024; + b_info->target_memkb = b_info->max_memkb; if (c_info->hvm) { b_info->shadow_memkb = libxl_get_required_shadow_memory(b_info->max_memkb, b_info->max_vcpus); b_info->video_memkb = 8 * 1024; @@ -2356,4 +2358,22 @@ void init_console_info(libxl_device_console *console, int dev_num, libxl_domain_ console->build_state = state; } +int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb) +{ + int rc = 0; + uint32_t videoram; + char *videoram_s = NULL; + char *dompath = libxl_xs_get_dompath(ctx, domid); + + videoram_s = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/memory/videoram", dompath)); + if (!videoram_s) + return -1; + videoram = atoi(videoram_s); + + libxl_xs_write(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/memory/target", dompath), "%lu", target_memkb); + if ((rc = xc_domain_setmaxmem(ctx->xch, domid, target_memkb + LIBXL_MAXMEM_CONSTANT)) != 0) return rc; + rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - videoram) / 4, NULL, NULL, NULL); + return rc; +} + diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index f315136b5e..3e0e281285 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -66,6 +66,7 @@ typedef struct { int max_vcpus; int cur_vcpus; uint32_t max_memkb; + uint32_t target_memkb; uint32_t video_memkb; uint32_t shadow_memkb; const char *kernel; @@ -305,6 +306,8 @@ int libxl_event_get_disk_eject_info(struct libxl_ctx *ctx, uint32_t domid, libxl int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid); int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid); +int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb); + int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num); struct libxl_dominfo * libxl_domain_list(struct libxl_ctx *ctx, int *nb_domain); diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index f99f20e976..60affe9207 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -52,7 +52,7 @@ int build_pre(struct libxl_ctx *ctx, uint32_t domid, if (info->vpt_align != -1) xc_set_hvm_param(ctx->xch, domid, HVM_PARAM_VPT_ALIGN, (unsigned long) info->vpt_align); xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus); - xc_domain_setmaxmem(ctx->xch, domid, info->max_memkb + info->video_memkb); + xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT); xc_domain_set_memmap_limit(ctx->xch, domid, (info->hvm) ? info->max_memkb : (info->max_memkb + info->u.pv.slack_memkb)); @@ -81,7 +81,9 @@ int build_post(struct libxl_ctx *ctx, uint32_t domid, ents[0] = "memory/static-max"; ents[1] = libxl_sprintf(ctx, "%d", info->max_memkb); ents[2] = "memory/target"; - ents[3] = libxl_sprintf(ctx, "%d", info->max_memkb); /* PROBABLY WRONG */ + ents[3] = libxl_sprintf(ctx, "%d", info->target_memkb); + ents[2] = "memory/videoram"; + ents[3] = libxl_sprintf(ctx, "%d", info->video_memkb); ents[4] = "domid"; ents[5] = libxl_sprintf(ctx, "%d", domid); ents[6] = "store/port"; @@ -145,7 +147,7 @@ int build_hvm(struct libxl_ctx *ctx, uint32_t domid, { int ret; - ret = xc_hvm_build(ctx->xch, domid, info->max_memkb / 1024, info->kernel); + ret = xc_hvm_build_target_mem(ctx->xch, domid, (info->max_memkb - info->video_memkb) / 1024, (info->target_memkb - info->video_memkb) / 1024, info->kernel); if (ret) { XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "hvm building failed"); return ERROR_FAIL; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 72997940f4..b793430ef9 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -31,6 +31,7 @@ #define LIBXL_DEVICE_MODEL_START_TIMEOUT 10 #define LIBXL_XENCONSOLE_LIMIT 1048576 #define LIBXL_XENCONSOLE_PROTOCOL "vt100" +#define LIBXL_MAXMEM_CONSTANT (1 * 1024 * 1024) #define QEMU_SIGNATURE "QemuDeviceModelRecord" #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c index 434d947f08..81e527af05 100644 --- a/tools/libxl/xl.c +++ b/tools/libxl/xl.c @@ -85,6 +85,7 @@ static void printf_info(libxl_domain_create_info *c_info, printf("vpt_align: %d\n", b_info->vpt_align); printf("max_vcpus: %d\n", b_info->max_vcpus); printf("max_memkb: %d\n", b_info->max_memkb); + printf("target_memkb: %d\n", b_info->target_memkb); printf("kernel: %s\n", b_info->kernel); printf("hvm: %d\n", b_info->hvm); @@ -283,8 +284,10 @@ static void parse_config_file(const char *filename, if (config_lookup_int (&config, "vcpus", &l) == CONFIG_TRUE) b_info->max_vcpus = l; - if (config_lookup_int (&config, "memory", &l) == CONFIG_TRUE) + if (config_lookup_int (&config, "memory", &l) == CONFIG_TRUE) { b_info->max_memkb = l * 1024; + b_info->target_memkb = b_info->max_memkb; + } if (config_lookup_int (&config, "shadow_memory", &l) == CONFIG_TRUE) b_info->shadow_memkb = l * 1024; @@ -754,6 +757,7 @@ static void help(char *command) printf(" restore restore a domain from a saved state\n\n"); printf(" cd-insert insert a cdrom into a guest's cd drive\n\n"); printf(" cd-eject eject a cdrom from a guest's cd drive\n\n"); + printf(" mem-set set the current memory usage for a domain\n\n"); } else if(!strcmp(command, "create")) { printf("Usage: xl create [options] [vars]\n\n"); printf("Create a domain based on .\n\n"); @@ -802,7 +806,52 @@ static void help(char *command) } else if (!strcmp(command, "cd-eject")) { printf("Usage: xl cd-eject \n\n"); printf("Eject a cdrom from a guest's cd drive.\n\n"); + } else if (!strcmp(command, "mem-set")) { + printf("Usage: xl mem-set \n\n"); + printf("Set the current memory usage for a domain.\n\n"); + } +} + +void set_memory_target(char *p, char *mem) +{ + struct libxl_ctx ctx; + uint32_t domid; + + libxl_ctx_init(&ctx); + libxl_ctx_set_log(&ctx, log_callback, NULL); + + if (libxl_param_to_domid(&ctx, p, &domid) < 0) { + fprintf(stderr, "%s is an invalid domain identifier\n", p); + exit(2); + } + libxl_set_memory_target(&ctx, domid, atoi(mem)); +} + +int main_memset(int argc, char **argv) +{ + int opt = 0; + char *p = NULL, *mem; + + while ((opt = getopt(argc, argv, "h:")) != -1) { + switch (opt) { + case 'h': + help("mem-set"); + exit(0); + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + if (optind >= argc - 1) { + help("mem-set"); + exit(2); } + + p = argv[optind]; + mem = argv[optind + 1]; + + set_memory_target(p, mem); + exit(0); } void console(char *p, int cons_num) @@ -1434,6 +1483,8 @@ int main(int argc, char **argv) main_cd_insert(argc - 1, argv + 1); } else if (!strcmp(argv[1], "cd-eject")) { main_cd_eject(argc - 1, argv + 1); + } else if (!strcmp(argv[1], "mem-set")) { + main_memset(argc - 1, argv + 1); } else if (!strcmp(argv[1], "help")) { if (argc > 2) help(argv[2]); -- 2.30.2